#include <iostream>
#include <unistd.h>
#include <cstring> //C++版本的string.h
#include <cerrno>  //C++版本的errno.h
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string>
#include <fcntl.h>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <signal.h>

void handler(int sig)
{
    std::cout << " get a sig: " << sig << std::endl;
}

int main()
{
    signal(SIGSEGV, handler);
    signal(SIGFPE, handler);
    //  崩溃了为什么会退出？  默认是终止进程
    //  可以不退出吗？可以，直接使用signal 函数重写默认动作，捕捉异常，但是不建议这样做

    // int a = 10;
    // a /= 0;        // 触发8号错误    (8) SIGFPE
    int *p = nullptr;  
    *p = 100;         // 触发11号错误   (11) SIGSEGV
    while (true)
    {
        std::cout << "hello bit, pid: " << getpid() << std::endl;
    }
}

// int cnt = 0;

// void handler(int signal)
// {
//     std::cout << "cnt " << cnt << " get a sig: " << signal << std::endl;
//     exit(1);
// }

// int main()
// {
//     signal(SIGALRM, handler);
//     alarm(5);   //设定一秒后的闹钟
//     sleep(2);
//     int n = alarm(0);
//     std::cout << "n: " << n << std::endl;
//     sleep(10);
//     while (true)
//     {
//         // std::cout << "cnt: " << cnt << std::endl;
//         cnt++;
//     }
// }

// void handler(int signal)
// {
//     std::cout << "get a sig: " << signal << std::endl;
// }

// int main()
// {
//     int cnt = 0;
//     signal(SIGABRT, handler);
//     while (true)
//     {
//         sleep(2);
//         abort();
//     }

// }

// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         std::cerr << "Usage: " << argv[0] << "signum pid" << std::endl;
//         return 1;
//     }
//     pid_t pid = std::stoi(argv[2]);
//     int signum = std::stoi(argv[1]);
//     kill(pid, signum);

//     return 0;
// }

// void handler(int signal)
// {
//     std::cout << "get a sig: " << signal << std::endl;
// }

// int main()
// {
//     //对信号的自定义捕捉，我们只要捕捉一次，后续就会有效
//     signal(2, handler);
//     signal(3, handler);
//     signal(4, handler);
//     signal(5, handler);
//     while (true)
//     {
//         std::cout << "hello bit, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
